﻿#region Using

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

#endregion

namespace Vk.Methods.Widgets
{
    /// <summary>
    ///     Виджеты
    /// </summary>
    public class Widgets
    {
        private readonly Api _api;

        public Widgets(Api api)
        {
            _api = api;
        }

        /// <summary>
        ///     Получает список комментариев к странице, оставленных через Виджет комментариев.
        ///     Данный метод может быть вызван без использования авторизационных данных (параметры session или access_token).
        /// </summary>
        /// <param name="widgetApiId">Идентификатор приложения/сайта, с которым инициализируются виджеты.</param>
        /// <param name="url">URL-адрес страницы</param>
        /// <param name="pageId">
        ///     Внутренний идентификатор страницы в приложении/сайте (в случае, если для инициализации виджетов
        ///     использовался параметр page_id)
        /// </param>
        /// <param name="order">
        ///     Тип сортировки комментариев. Возможные значения: date, likes, last_comment. Значение по умолчанию -
        ///     date.
        /// </param>
        /// <param name="fields">
        ///     Перечисленные через запятую поля анкет, необходимые для получения. Если среди полей присутствует
        ///     replies, будут возращены последние комментарии второго уровня для каждого комментария 1го уровня.
        /// </param>
        /// <param name="offset">
        ///     Смещение, необходимое для выборки определённого подмножества результатов поиска. Значение по
        ///     умолчанию - 0.
        /// </param>
        /// <param name="count">Количество комментариев, которое необходимо вернуть, 10-200. Значение по умолчанию - 10.</param>
        public async Task<CommentsInfo> GetComments(int widgetApiId,
                                                    string url = null,
                                                    int? pageId = null,
                                                    CommentsSortOrder order = null,
                                                    IEnumerable<string> fields = null,
                                                    int? offset = null,
                                                    int? count = null)
        {
            var query = new ApiQuery("widgets.getComments", true)
                .Add("widget_api_id", widgetApiId)
                .Add("url", url)
                .Add("page_id", pageId)
                .Add("order", order.Value)
                .Add("fields", fields)
                .Add("offset", offset)
                .Add("count", count);

            var result = await _api.Manager.Execute(query);
            if (_api.Manager.MethodSuccessed)
            {
                return !result.ChildNodes.Any() ? null : new CommentsInfo(result);
            }
            return null;
        }

        /// <summary>
        ///     Получает список страниц приложения/сайта, на которых установлен Виджет комментариев или «Мне нравится».
        ///     Данный метод может быть вызван без использования авторизационных данных (параметры session или access_token).
        /// </summary>
        /// <param name="widgetApiId">Идентификатор приложения/сайта, с которым инициализируются виджеты.</param>
        /// <param name="order">
        ///     Тип сортировки страниц. Возможные значения: date, comments, likes, friend_likes. Значение по
        ///     умолчанию - friend_likes.
        /// </param>
        /// <param name="period">Период выборки. Возможные значения: day, week, month, alltime. Значение по умолчанию - week.</param>
        /// <param name="offset">
        ///     Смещение, необходимое для выборки определённого подмножества результатов поиска. Значение по
        ///     умолчанию - 0.
        /// </param>
        /// <param name="count">Количество страниц которое необходимо вернуть, 10-200. Значение по умолчанию - 10.</param>
        public async Task<PagesInfo> GetPages(int widgetApiId,
                                              PagesSortOrder order = null,
                                              SelectPeriod period = null,
                                              int? offset = null,
                                              int? count = null)
        {
            var query = new ApiQuery("widgets.getPages", true);

            var result = await _api.Manager.Execute(query);

            if (_api.Manager.MethodSuccessed)
            {
                return !result.ChildNodes.Any() ? null : new PagesInfo(result);
            }
            return null;
        }
    }
}